﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BussinesLayer.Clases;
using CustomControl;
using DTO.Clases;
using Utilities;

namespace Aplicacion.Ventas.Factura.Abonos
{
    public partial class FrmCancelarVenta : Form
    {
        private BussinesFormaPago miBussinesPago;

        //public DateTime Fecha { set; get; }
        public string NumeroFactura { set; get; }
        Validacion validacion;
        private bool Efectivo = false;
        private bool Cheque = false;
        private bool Tarjeta = false;
        private bool Venta = true;
        public bool Abono = false;
        private bool AbonoMatch = false;

        public FrmCancelarVenta()
        {
            InitializeComponent();
            miBussinesPago = new BussinesFormaPago();
            validacion = new Validacion();
        }

        private void FrmCancelarVenta_Load(object sender, EventArgs e)
        {
            
        }

        private void FrmCancelarVenta_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F6)
            {
                txtAbono_Validating(txtAbono, new CancelEventArgs(false));
                txtEfectivo_Validating(txtEfectivo, new CancelEventArgs(false));
                txtCheque_Validating(txtCheque, new CancelEventArgs(false));
                txtTarjeta_Validating(txtTarjeta, new CancelEventArgs(false));
                 //DialogResult rta = MessageBox.Show("¿Está seguro(a) de querer realizar el abono?",
                              //  "Realizar Abono", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                 //if (rta == DialogResult.Yes)
                 //{
                     if (AbonoMatch && Efectivo && Cheque && Tarjeta)
                     {
                         var suma = UseObject.RemoveSeparatorMil(txtEfectivo.Text) +
                                    UseObject.RemoveSeparatorMil(txtCheque.Text) +
                                    UseObject.RemoveSeparatorMil(txtTarjeta.Text);
                         if (suma >= UseObject.RemoveSeparatorMil(txtAbono.Text))
                         {
                             txtCambio.Text = UseObject.InsertSeparatorMil
                                    ((suma - UseObject.RemoveSeparatorMil(txtAbono.Text)).ToString());
                             DialogResult rta = MessageBox.Show("¿Está seguro(a) de querer realizar el abono?",
                                "Realizar Abono", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                             if (rta == DialogResult.Yes)
                             {
                                 var formas = FormasDePago();
                                 try
                                 {
                                     foreach (FormaPago pago in formas)
                                     {
                                         if (pago.Valor != 0)
                                         {
                                             pago.NumeroFactura = NumeroFactura;
                                             pago.Usuario.Id = 6;
                                             pago.Caja.Id = 1;
                                             pago.Fecha = DateTime.Now;
                                             miBussinesPago.IngresarPagoAFactura(pago, true);
                                         }
                                     }
                                     OptionPane.MessageInformation("El abono se realizó con éxito.");
                                     this.Close();
                                 }
                                 catch (Exception ex)
                                 {
                                     OptionPane.MessageError(ex.Message);
                                 }
                             }
                         }
                         else
                         {
                             OptionPane.MessageInformation("Las formas de pago deben superar el valor del abono.");
                             txtEfectivo.Focus();
                         }
                     }
                 //}
                /*
                if (Venta)
                {
                    if (!Abono)
                    {
                        rta = MessageBox.Show("¿Está seguro(a) de querer cerrar la venta?",
                                "Cerrar Venta", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                        if (rta == DialogResult.Yes)
                        {
                            if (Efectivo && Cheque && Tarjeta)
                            {
                                var suma = UseObject.RemoveSeparatorMil(txtEfectivo.Text) +
                                           UseObject.RemoveSeparatorMil(txtCheque.Text) +
                                           UseObject.RemoveSeparatorMil(txtTarjeta.Text);
                                if (suma >= UseObject.RemoveSeparatorMil(txtTotal.Text))
                                {
                                    txtCambio.Text = UseObject.InsertSeparatorMil
                                    (
                                        ((UseObject.RemoveSeparatorMil(txtEfectivo.Text) +
                                         UseObject.RemoveSeparatorMil(txtCheque.Text) +
                                         UseObject.RemoveSeparatorMil(txtTarjeta.Text)) -
                                         UseObject.RemoveSeparatorMil(txtTotal.Text))
                                         .ToString()
                                    );
                                    var formas = FormasDePago();
                                    /*if (Abono)
                                    {
                                        foreach (FormaPago pago in formas)
                                        {
                                            try
                                            {
                                                miBussinesPago.IngresarPagoAFactura(pago, true);
                                                OptionPane.MessageInformation("El abono se realizó con éxito.");
                                            }
                                            catch (Exception ex)
                                            {
                                                OptionPane.MessageError(ex.Message);
                                            }
                                        }
                                    }
                                    //else
                                    //{
                                    CompletaEventos.CapturaEvento(formas);
                                    //}
                                    //OptionPane.MessageSuccess("La venta se realizó con éxito!");
                                    Venta = false;
                                    formas = null;
                                }
                                else
                                {
                                    OptionPane.MessageInformation("El valor ingresado debe ser superior " +
                                        "al de la venta.");
                                }
                            }
                        }
                    }
                    else
                    {
                        rta = MessageBox.Show("¿Está seguro(a) de querer realizar el abono?",
                                "Realizar Abono", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                        if (rta == DialogResult.Yes)
                        {
                            if (Efectivo && Cheque && Tarjeta)
                            {
                                var suma = UseObject.RemoveSeparatorMil(txtEfectivo.Text) +
                                           UseObject.RemoveSeparatorMil(txtCheque.Text) +
                                           UseObject.RemoveSeparatorMil(txtTarjeta.Text);

                                var formas = FormasDePago();
                                
                                    try
                                    {
                                        foreach (FormaPago pago in formas)
                                        {
                                            if (pago.Valor != 0)
                                            {
                                                pago.NumeroFactura = NumeroFactura;
                                                pago.Fecha = DateTime.Today;
                                                miBussinesPago.IngresarPagoAFactura(pago, true);
                                                
                                            }
                                        }
                                        OptionPane.MessageInformation("El abono se realizó con éxito.");
                                    }
                                    catch (Exception ex)
                                    {
                                        OptionPane.MessageError(ex.Message);
                                    }
                                
                            }
                        }
                    }
                }
                */
            }
            else
            {
                if (e.KeyData == Keys.Escape)
                {
                    this.Close();
                    /*DialogResult rta = MessageBox.Show("¿Está seguro(a) de querer cerrar la venta?",
                        "Cerrar Venta", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                    if (rta == DialogResult.Yes)
                    {
                        OptionPane.MessageSuccess("La venta se realizó con éxito!");
                        CompletaEventos.CapturaEvento(true);
                        this.Close();
                    }*/
                }
            }
        }

        private void FrmCancelarVenta_FormClosing(object sender, FormClosingEventArgs e)
        {
            CompletaEventos.CapturaEvento(15);
        }

        private void txtAbono_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar.Equals((Char)Keys.Enter))
            {
                txtEfectivo.Focus();
            }
        }

        private void txtAbono_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtAbono.Text))
            {
                txtAbono.Text = txtAbono.Text.Replace(".", "");
                if (validacion.ValidarNumeroInt(txtAbono.Text))
                {
                    if (Convert.ToInt32(txtAbono.Text) <= UseObject.RemoveSeparatorMil(txtTotal.Text))
                    {
                        txtAbono.Text = UseObject.InsertSeparatorMil(txtAbono.Text);
                        AbonoMatch = true;
                    }
                    else
                    {
                        OptionPane.MessageError("El valor del Abono no debe ser superior al Total.");
                        AbonoMatch = false;
                    }
                }
                else
                {
                    OptionPane.MessageError("El valor del Abono es incorrecto.");
                    AbonoMatch = false;
                }
            }
            else
            {
                txtAbono.Text = "0";
                AbonoMatch = false;
            }
        }

        private void txtEfectivo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar.Equals((Char)Keys.Enter))
            {
                txtCheque.Focus();
            }
        }

        private void txtEfectivo_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtEfectivo.Text))
            {
                txtEfectivo.Text = txtEfectivo.Text.Replace(".", "");
                if (validacion.ValidarNumeroInt(txtEfectivo.Text))
                {
                    txtEfectivo.Text = UseObject.InsertSeparatorMil(txtEfectivo.Text);
                    Efectivo = true;
                }
                else
                {
                    OptionPane.MessageError("El valor del Efectivo es incorrecto.");
                    Efectivo = false;
                }
            }
            else
            {
                txtEfectivo.Text = "0";
                Efectivo = true;
            }
        }

        private void txtCheque_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar.Equals((Char)Keys.Enter))
            {
                txtTarjeta.Focus();
            }
        }

        private void txtCheque_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtCheque.Text))
            {
                txtCheque.Text = txtCheque.Text.Replace(".", "");
                if (validacion.ValidarNumeroInt(txtCheque.Text))
                {
                    txtCheque.Text = UseObject.InsertSeparatorMil(txtCheque.Text);
                    Cheque = true;
                }
                else
                {
                    OptionPane.MessageError("El valor del Cheque es incorrecto.");
                    Cheque = false;
                }
            }
            else
            {
                txtCheque.Text = "0";
                Cheque = true;
            }
        }

        private void txtTarjeta_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar.Equals((Char)Keys.Enter))
            {
                FrmCancelarVenta_KeyDown(this, new KeyEventArgs(Keys.F6));
            }
        }

        private void txtTarjeta_Validating(object sender, CancelEventArgs e)
        {
            if (!String.IsNullOrEmpty(txtTarjeta.Text))
            {
                txtTarjeta.Text = txtTarjeta.Text.Replace(".", "");
                if (validacion.ValidarNumeroInt(txtTarjeta.Text))
                {
                    txtTarjeta.Text = UseObject.InsertSeparatorMil(txtTarjeta.Text);
                    Tarjeta = true;
                }
                else
                {
                    OptionPane.MessageError("El valor de la Tarjeta es incorrecto.");
                    Tarjeta = false;
                }
            }
            else
            {
                txtTarjeta.Text = "0";
                Tarjeta = true;
            }
        }

        private List<DTO.Clases.FormaPago> FormasDePago()
        {
            var Abono = UseObject.RemoveSeparatorMil(txtAbono.Text);
            var Efectivo = UseObject.RemoveSeparatorMil(txtEfectivo.Text);
            var Cheque = UseObject.RemoveSeparatorMil(txtCheque.Text);
            var Tarjeta = UseObject.RemoveSeparatorMil(txtTarjeta.Text);

            var Formas = new List<DTO.Clases.FormaPago>();
            if (Efectivo <= Abono)
            {
                if (Efectivo != 0)
                {
                    Formas.Add(new DTO.Clases.FormaPago
                    {
                        IdFormaPago = 1,
                        Valor = Convert.ToInt32(Efectivo)
                    });
                }
                if (Cheque <= (Abono - Efectivo))
                {
                    if (Cheque != 0)
                    {
                        Formas.Add(new DTO.Clases.FormaPago
                        {
                            IdFormaPago = 2,
                            Valor = Convert.ToInt32(Cheque)
                        });
                    }
                    if (Tarjeta <= (Abono - (Efectivo + Cheque)))
                    {
                        if (Tarjeta != 0)
                        {
                            Formas.Add(new DTO.Clases.FormaPago
                            {
                                IdFormaPago = 3,
                                Valor = Convert.ToInt32(Tarjeta)
                            });
                        }
                    }
                    else
                    {
                        Formas.Add(new DTO.Clases.FormaPago
                        {
                            IdFormaPago = 3,
                            Valor = Convert.ToInt32(Abono - (Efectivo + Cheque))
                        });
                    }
                }
                else
                {
                    Formas.Add(new DTO.Clases.FormaPago
                    {
                        IdFormaPago = 2,
                        Valor = Convert.ToInt32(Abono - Efectivo)
                    });
                }
            }
            else
            {
                Formas.Add(new DTO.Clases.FormaPago
                {
                    IdFormaPago = 1,
                    Valor = Convert.ToInt32(Abono)
                });
            }
            return Formas;
        }
    }
}